home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
DJGPP
/
BCCGRX12.ZIP
/
contrib
/
bcc2grx
/
test
/
htmext.inc
< prev
next >
Wrap
Text File
|
1993-06-04
|
7KB
|
268 lines
/* ------------------------------------------------------------------- */
/* ---- New demo routines ---- */
/* ------------------------------------------------------------------- */
int _max(int a, int b)
{
return ( a>b ? a : b );
}
int _min(int a, int b)
{
return ( a<b ? a : b );
}
void ShiftDac(char pal[][3])
{
int r,g,b;
int k, l;
for (k=0;k<=1;k++) {
r=pal[254][0];
g=pal[254][1];
b=pal[254][2];
for (l=254;l>=1;l--) {
pal[l][0]=pal[l-1][0];
pal[l][1]=pal[l-1][1];
pal[l][2]=pal[l-1][2];
}
pal[1][0]=r;
pal[1][1]=g;
pal[1][2]=b;
}
for (k=0;k<=255;k++)
setrgbpalette(k,pal[k][0],pal[k][1],pal[k][2]);
}
void PlayRGBpalette(void)
/* This is partially copyrighted by COPYRIGHT(C) 1990 by H+BEDV */
{
typedef char _PAL[256][3];
int x,c, m, maxx, maxy, radius, height, ycenter;
float pc;
_PAL cpal;
struct viewporttype viewinfo;
if ( getmaxcolor() != 255) return;
for (c=0;c<=255;c++) {
m= (c*3)>>1;
if ((m<64)) {
cpal[c][0]=63;
cpal[c][1]=m;
cpal[c][2]=0;
}
if ((m>63) && (m<128)) {
cpal[c][0]=127-m;
cpal[c][1]=63;
cpal[c][2]=0;
}
if ((m>127) && (m<192)) {
cpal[c][0]=0;
cpal[c][1]=63;
cpal[c][2]=m-128;
}
if ((m>191) && (m<256)) {
cpal[c][0]=0;
cpal[c][1]=255-m;
cpal[c][2]=63;
}
if ((m>255) && (m<320)) {
cpal[c][0]=m-256;
cpal[c][1]=0;
cpal[c][2]=63;
}
if ((m>319)) {
cpal[c][0]=63;
cpal[c][1]=0;
cpal[c][2]=383-m;
}
}
cpal[0][0]=0;
cpal[0][1]=0;
cpal[0][2]=0;
cpal[255][0]=63;
cpal[255][1]=63;
cpal[255][2]=63;
ShiftDac( cpal);
MainWindowColor( "Play RGB palette", 255);
getviewsettings( &viewinfo );
maxx = abs(viewinfo.right-viewinfo.left)-1;
maxy = abs(viewinfo.top-viewinfo.bottom)-1;
setcolor(255);
height = maxy/8;
c=1;
for (x=5; x <= maxx+1-5; ++x) {
setcolor(c);
if (++c > 254) c = 1;
line(x,maxy-5,x,maxy-5-height);
}
pc=1.0;
ycenter = (maxy-5-height) / 2;
radius = _min(maxy-5-height, maxx)*9/20;
for (x=0;x<=356;x++) {
setcolor(pc);
setfillstyle(SOLID_FILL,pc);
pieslice(maxx/2,ycenter,x,x+4,radius);
pc=pc+254.0/360.0;
}
StatusLineColor( StopMsg, 255);
do {
ShiftDac(cpal);
} while (!(kbhit()));
getch();
for (c=1; c < 255; ++c) {
cpal[c][0] = _dac_g256[c][0];
cpal[c][1] = _dac_g256[c][1];
cpal[c][2] = _dac_g256[c][2];
}
StatusLineColor( PauseMsg, 255);
do {
ShiftDac(cpal);
} while (!(kbhit()));
setbkcolor(BLACK);
clearviewport();
setrgbdefaults();
Pause(); /* Pause for user to read screen*/
}
/* The Sierpinski demo was mainly taken from
N. Wirth: Algorithmen und Datenstrukturen */
#define SIRP_N 4
#define SIRP_H0 320
static int SIRP_x, SIRP_y, h;
static void SIRP_a(int i);
static void SIRP_b(int i);
static void SIRP_c(int i);
static void SIRP_d(int i);
static void SIRP_a(int i)
{
if (i>0) {
SIRP_a(i-1); SIRP_x += h; SIRP_y -= h; lineto( SIRP_x, SIRP_y);
SIRP_b(i-1); SIRP_x += 2*h; lineto( SIRP_x, SIRP_y);
SIRP_d(i-1); SIRP_x += h; SIRP_y += h; lineto( SIRP_x, SIRP_y);
SIRP_a(i-1);
}
}
static void SIRP_b(int i)
{
if (i>0) {
SIRP_b(i-1); SIRP_x -= h; SIRP_y -= h; lineto( SIRP_x, SIRP_y);
SIRP_c(i-1); SIRP_y -= 2*h; lineto( SIRP_x, SIRP_y);
SIRP_a(i-1); SIRP_x += h; SIRP_y -= h; lineto( SIRP_x, SIRP_y);
SIRP_b(i-1);
}
}
static void SIRP_c(int i)
{
if (i>0) {
SIRP_c(i-1); SIRP_x -= h; SIRP_y += h; lineto( SIRP_x, SIRP_y);
SIRP_d(i-1); SIRP_x -= 2*h; lineto( SIRP_x, SIRP_y);
SIRP_b(i-1); SIRP_x -= h; SIRP_y -= h; lineto( SIRP_x, SIRP_y);
SIRP_c(i-1);
}
}
static void SIRP_d(int i)
{
if (i>0) {
SIRP_d(i-1); SIRP_x += h; SIRP_y += h; lineto( SIRP_x, SIRP_y);
SIRP_a(i-1); SIRP_y += 2*h; lineto( SIRP_x, SIRP_y);
SIRP_c(i-1); SIRP_x -= h; SIRP_y += h; lineto( SIRP_x, SIRP_y);
SIRP_d(i-1);
}
}
void sierpinski(void)
{
int i, h0, x0, y0, bx, by;
int border, color;
struct viewporttype vp;
struct fillsettingstype fs;
MainWindow( "Floodfill demo");
StatusLine(PauseMsg);
getviewsettings( &vp);
getfillsettings( &fs);
setviewport( (bx=_max((getmaxx() - SIRP_H0) / 2, vp.left)),
(by=_max((getmaxy() - SIRP_H0) / 2, vp.top)),
_min((getmaxx() + SIRP_H0) / 2 + 5, vp.right),
_min((getmaxy() + SIRP_H0) / 2 + 5, vp.bottom),
TRUE );
switch (random(6)) {
case 0 : border = LIGHTCYAN; break;
case 1 : border = YELLOW; break;
case 2 : border = RED; break;
case 3 : border = GREEN; break;
case 4 : border = BLUE; break;
default: border = WHITE; break;
}
setcolor( border);
h0 = SIRP_H0;
h = h0 / 4;
x0 = 2*h;
y0 = 3*h;
for (i=1; i <= SIRP_N; ++i) {
x0 -= h;
h /= 2;
y0 += h;
SIRP_x = x0; SIRP_y = y0;
moveto( SIRP_x, SIRP_y);
SIRP_a(i); SIRP_x += h; SIRP_y -= h; lineto(SIRP_x,SIRP_y);
SIRP_b(i); SIRP_x -= h; SIRP_y -= h; lineto(SIRP_x,SIRP_y);
SIRP_c(i); SIRP_x -= h; SIRP_y += h; lineto(SIRP_x,SIRP_y);
SIRP_d(i); SIRP_x += h; SIRP_y += h; lineto(SIRP_x,SIRP_y);
}
setviewport( vp.left, vp.top, vp.right, vp.bottom, vp.clip);
bx += h0/2 - vp.left;
by += h0/2 - vp.top;
do {
do
color = random(getmaxcolor()+1);
while (color == WHITE || color == BLACK || color == border);
setfillstyle(random(USER_FILL-1)+1, color);
floodfill( bx, by, border);
floodfill( 1, 1, border);
} while ( !kbhit());
setfillstyle( fs.pattern, fs.color);
Pause(); /* Pause for user to read screen*/
}
void RandomSolidBars(void)
{
int color;
MainWindow( "Random Solid/Line Bars" );
StatusLine( PauseMsg ); /* Put msg at bottom of screen */
while( !kbhit() ){ /* Until user enters a key... */
color = random( MaxColors-1 )+1;
setcolor( color );
/* SOLID_FILL && LINE_FILL are much faster */
setfillstyle( SOLID_FILL+random(2), color );
bar3d( random( getmaxx() ), random( getmaxy() ),
random( getmaxx() ), random( getmaxy() ), 0, OFF);
}
Pause(); /* Pause for user's response */
}